package Persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Iterator;
import java.util.Vector;

import Negocio.Cereal;
import Negocio.Cosecha;
import Negocio.Lote;
import Negocio.Siembra;

public class AdmPersistenciaSiembra extends AdministradorPersistencia {

	private static AdmPersistenciaSiembra instancia;

	public static AdmPersistenciaSiembra getInstancia() {
		if (instancia == null)
			return new AdmPersistenciaSiembra();
		return instancia;
	}

	@Override
	public void borrar(Object d) {
		// TODO Hacer funcionalidad
	}

	@Override
	public Long insertar(Object o) {
		try {
			Siembra a = (Siembra) o;
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement("insert into siembra values (?,?)");

			s.setLong(1, a.getCereal().getCodigo());
			s.setDouble(2, a.getCantidadSembrada());
			s.execute();
			
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			s = con.prepareStatement("select max(codigo) from siembra");
			ResultSet result = s.executeQuery();
			Long res = null;
			if (result.next())
				res = result.getLong(1);
				asignarLoteSiembra(res, a.getLotes());
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return res;

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// TODO Exception
		System.out.println("No se pudo insertar el elemento");
		return null;

	}

	@Override
	public Vector<Object> buscarTodos() {
		try {

			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement("select * from Siembra ");
			Vector<Object> siem = new Vector<Object>();
			ResultSet res = s.executeQuery();
			while (res.next()) {
				Cereal cer = (Cereal) AdmPersistenciaCereal.getInstancia()
						.buscarPorCodigo(res.getLong(2));

				siem.add(new Siembra(res.getLong(1),cer,res.getDouble(3)));

			}
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return siem;

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// TODO Exception
		System.out.println("No se pudo insertar el elemento");
		return null;
	}

	@Override
	public Object buscarPorCodigo(Object o) {
		try {
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement("select * from Cosecha where codigo = ? ");
			Cosecha cos = null;
			s.setLong(1, (Long) o);

			ResultSet res = s.executeQuery();
			while (res.next()) {
				Cereal cer = (Cereal) AdmPersistenciaCereal.getInstancia()
						.buscarPorCodigo(res.getLong(5));
				cos = new Cosecha(res.getLong(1), res.getString(2), res
						.getString(3), res.getDouble(4), cer, res.getLong(6),
						res.getString(7));

			}
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return cos;

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// TODO Exception
		System.out.println("No se pudo insertar el elemento");
		return null;
	}

	@Override
	public void modificar(Object o) {
		try {
			Siembra a = (Siembra) o;
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement("update Cosecha set cereal = ?, cantidad = ? where codigo = ? ");
			
			s.setLong(1, a.getCereal().getCodigo());
			s.setDouble(2, a.getCantidadSembrada());
			s.setLong(3, a.getCodigo());
			s.execute();
			
			asignarLoteSiembra(a.getCodigo(), a.getLotes());

			PoolConnection.getPoolConnection().realeaseConnection(con);

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// TODO Exception
		System.out.println("No se pudo insertar el elemento");

	}

	public void asignarLoteSiembra(long codigo, Collection<Lote> o) {
		try {
			System.out
					.println("Log: AdmPersistenciaLoteSimple / asignarLoteSiembra [INI]");
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = null;
			try {
				s = con
						.prepareStatement("delete from siembra_lote where idsiembra = ?");
				s.setLong(1, codigo);
				s.execute();
			} catch (Exception e) {
				System.out.println("No hay lotes en la siembra");
			}

			Iterator<Lote> lotes = o.iterator();
			while (lotes.hasNext()) {
				Lote lot = lotes.next();
				s = con.prepareStatement("insert into siembra_lote values (?,?)");
				s.setLong(1, codigo);
				s.setLong(2, lot.getCodigo());
				s.execute();

			}

			PoolConnection.getPoolConnection().realeaseConnection(con);

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out
				.println("Log: AdmPersistenciaLoteSimple / asignarLoteSiembra [FIN]");
	}

}
